<?php

namespace App\Modules\CodeDesigner\ComponentMode;

/**
 * 组件接口会声明组合中简单和复杂对象的通用操作。
 */
abstract class Component
{
    /**
     * @var Component
     */
    protected $parent;

    /**
     * 可选地，基础组件可以声明一个用于设置和的接口以树状结构访问组件的父组件。它还可以
     * @param Component $parent
     */
    public function setParent(Component $parent): void
    {
        $this->parent = $parent;
    }

    /**
     * @return Component
     */
    public function getParent(): Component
    {
        return $this->parent;
    }

    /**
     * @param Component $component
     * @return void
     */
    public function add(Component $component): void {}

    /**
     * @param Component $component
     * @return void
     */
    public function remove(Component $component): void {}

    /**
     * @return string
     */
    public abstract function operation(): string;
}